package com.stlm2.util;

import com.stlm2.core.AppConfig;

import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.URLDecoder;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 字符串常用工具类。
 * 
 * @author nvoyager
 *
 */
public class StringUtils {

	/**
	 * 字符串为null 或 "" 返回true，否则返回false
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isNullOrEmpty(String str) {
		return (str == null || str.equals(""));
	}

	/**
	 * 字符串不为 null 或 "" 返回true
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isNotNullAndEmpty(String str) {
		return (str != null && (!str.equals("")));
	}

	/**
	 * 判定字符串是否为null,或只有空白字符空
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isNullOrTrimEmpty(String s) {
		if (s == null)
			return true;

		return s.trim().equals("");
	}

	/**
	 * 获得指定参数
	 * 
	 * @param params
	 * @param s
	 * @return
	 */
	public static Object getParam(Map params, String s) {
		if (!params.containsKey(s))
			return null;

		return params.get(s);
	}

	/**
	 * 精度
	 * 
	 * @param value
	 * @param decimal
	 * @return
	 */
	public static double doubleFormat(double value, int decimal) {
		value = Math.round(value * Math.pow(10, decimal))
				/ Math.pow(10, decimal);
		BigDecimal bd = new BigDecimal(value);
		bd = bd.setScale(decimal, BigDecimal.ROUND_HALF_UP);
		return bd.doubleValue();
	}

	public static String urlDecode(String s, String enc) {
		if (isNullOrEmpty(s))
			return s;

		try {
			return URLDecoder.decode(s, enc);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 获得指定范围的随机值 >minNum <=maxNum
	 * 
	 * @param minNum
	 * @param maxNum
	 * @return
	 */
	public static int getRandom(int minNum, int maxNum) {
		return (int) ((maxNum - minNum) * Math.random() + minNum + 1);
	}

	/**
	 * 是否为数字
	 * 
	 * @param str
	 * @return
	 */
	public static boolean isNum(String str) {
		if (isNullOrTrimEmpty(str))
			return false;

		return str.matches("^[-+]?(([0-9]+)([.]([0-9]+))?)$");
	}

	/**
	 * 是否为手机号
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isMobilePhone(String s) {
		if (isNullOrEmpty(s)) {
			return false;
		}
		return s.matches("^[1][3-9][0-9]{9}$");
	}

	/**
	 * 是否为邮箱
	 *
	 * @param email
	 * @return
	 */
	public static boolean isMobileEmail(String email) {
		if (isNullOrEmpty(email)) {
			return false;
		}
		return email.matches("\\w+\\x40\\w+\\x2e\\w+");
	}



	
	/**
	 * 获得html中的第一张图片
	 * 如果包含资源路径，会将其剔除
	 * @param html
	 * @return
	 */
	public static String getFirstImageFromHtml(String html){
		if(isNullOrTrimEmpty(html))
			return "";
		
		Pattern p = Pattern.compile("<img[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>");
        Matcher m = p.matcher(html);
        String image = "";
        while(m.find()){
        	html = m.group(1);
            if(isNotNullAndEmpty(html) && html.contains(AppConfig.RESOURCE_APP_ROOT))
            	image = html.substring(html.indexOf(AppConfig.RESOURCE_APP_ROOT) + AppConfig.RESOURCE_APP_ROOT.length(), html.length());
            break;
        }
        return image;
	}

	/**
	 * 由万元的字符串得到元的数值
	 * 
	 * @param str
	 * @return
	 */
	public static Integer getIntFromWanString(String str) {
		Integer num = null;

		int index = str.indexOf(".");
		if (index > 0) {
			int w = Integer.valueOf(str.substring(0, index)) * 10000;
			String oStr = str.substring(index + 1);
			if (oStr.length() > 4)
				oStr = oStr.substring(0, 4);
			int o = 0;
			switch (oStr.length()) {
			case 1:
				o = 1000;
				break;
			case 2:
				o = 100;
				break;
			case 3:
				o = 10;
				break;
			case 4:
				o = 1;
				break;
			}
			o = Integer.valueOf(oStr) * o;
			num = w + o;
		} else if (index < 0)
			num = Integer.valueOf(str) * 10000;

		return num;
	}

	public static boolean hasImageModified(String url) {
		if (StringUtils.isNullOrTrimEmpty(url))
			return false;

		return url.contains(AppConfig.RESOURCE_APP_ROOT)
				|| url.contains(AppConfig.getContextPath() + "static/");

	}
}
